package hello

import (
	"fmt"
)

// 这种因式分解关键字的写法一般用于声明全局变量
var (
	gv1 uint8
	gv2 byte
	gv3 float32
	gv4 complex64
)

var e, f = 123, "hello"

//这种不带声明格式的只能在函数体中出现
//g, h := 123, "hello"

//var pn *int
//var arrayN [5]int
//var sliceN [] int
//var chInt chan int
//var f func(string2 string) int
//var e error
//pn = n32

func Hello1() { // comment test
	fmt.Println("\n------------ Hello1() -------------- start.\n") // 向 stdout 输出
	print("------------ Hello1() -------------- start.\n")         // 向 stderr 输出

	var s string = "a string!"
	s1 := "Run oob" // var f string = "Run oob"
	fmt.Println(s, s1)

	var b bool = true
	fmt.Println(b)

	var n1, n2, n3 int
	var vname1, vname2, vname3 = n1, n2, n3
	n1 = 15
	n2 = 15
	n3 = 15
	vname4, vname5, vname6 := n1, " stringVar", n3

	n32 := 65530 // := 赋值方式 可省略前面的 var , 并自动判断类型
	fmt.Printf("DEC: %03d \nOCT: %4o\nHEX: %04X\nHEX: %04X\n", n1, n2, n3, n32)
	fmt.Printf("DEC: %03d \nOCT: %4o\nHEX: %04X\n", vname1, vname2, vname3)
	fmt.Printf("DEC: %03d \nOCT: %4s\nHEX: %04X\n", vname4, vname5, vname6)

	// global var
	gv3 = 34.945
	fmt.Printf("float:%4f\n", gv3)
	fmt.Printf("float:%g\n", gv3)

	gv4 = 22.1 + 34.6i
	fmt.Printf("complex:%f\n", gv4)
	fmt.Printf("complex:%g\n", gv4) // %g 格式  以更紧凑的（无末尾的0）输出

	//
	fmt.Printf("global var: %d,  %s %d\n", e, f, len(vname5))

	const const1 = "abc"
	fmt.Println("const: ", const1)

	fmt.Println("hello world !") // comment test
	fmt.Printf("hello world %s \n", " it's me 5!")

	println("------------ Hello1() -------------- complete.")
	fmt.Println("------------ Hello1() -------------- complete.")
}

func Add(x, y int) int {
	return x + y
}

func OperatorTest() {
	fmt.Println("------------ OperatorTest() --------------")
	var a int = 21
	var b int = 10
	var c int

	c = a + b
	fmt.Printf("第一行 - c 的值为 %d\n", c)
	c = a - b
	fmt.Printf("第二行 - c 的值为 %d\n", c)
	c = a * b
	fmt.Printf("第三行 - c 的值为 %d\n", c)
	c = a / b
	fmt.Printf("第四行 - c 的值为 %d\n", c)
	c = a % b
	fmt.Printf("第五行 - c 的值为 %d\n", c)
	a++
	fmt.Printf("第六行 - a 的值为 %d\n", a)
	a = 21 // 为了方便测试，a 这里重新赋值为 21
	a--
	fmt.Printf("第七行 - a 的值为 %d\n", a)
}

func LogicTest() {
	fmt.Println("------------ LogicTest() --------------")
	var a int = 21
	var b int = 10

	fmt.Printf("a=%d  b=%d\n", a, b)

	if a == b {
		fmt.Printf("第一行 - a 等于 b\n")
	} else {
		fmt.Printf("第一行 - a 不等于 b\n")
	}
	if a < b {
		fmt.Printf("第二行 - a 小于 b\n")
	} else {
		fmt.Printf("第二行 - a 不小于 b\n")
	}

	if a > b {
		fmt.Printf("第三行 - a 大于 b\n")
	} else {
		fmt.Printf("第三行 - a 不大于 b\n")
	}
	/* Lets change value of a and b */
	a = 5
	b = 20
	if a <= b {
		fmt.Printf("第四行 - a 小于等于 b\n")
	}
	if b >= a {
		fmt.Printf("第五行 - b 大于等于 a\n")
	}
}

func BitOperatorTest() {
	fmt.Println("------------ BitOperatorTest() --------------")

	var a uint = 60 /* 60 = 0011 1100 */
	var b uint = 13 /* 13 = 0000 1101 */
	var c uint = 0

	fmt.Printf("a=%08b'BIN     \nb=%08b'BIN  \nc=%08b'BIN \n", a, b, c)

	c = a & b /* 12 = 0000 1100 */
	fmt.Printf("a & b 的值为 %08b\n", c)

	c = a | b /* 61 = 0011 1101 */
	fmt.Printf("a | b 的值为 %08b\n", c)

	c = a ^ b /* 49 = 0011 0001 */
	fmt.Printf("a ^ b 的值为 %08b\n", c)

	c = a << 2 /* 240 = 1111 0000 */
	fmt.Printf("a << 2 的值为 %08b\n", c)

	c = a >> 2 /* 15 = 0000 1111 */
	fmt.Printf("a >> 2 的值为 %08b\n", c)
}
